package com.indra.bbva.pe.monitor.in.utils;


import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

import com.pe.bbva.utils.Constantes;
import com.stefanini.pe.bbva.bp.in.to.Archivo;
import com.stefanini.pe.bbva.bp.in.to.Correo;
import com.stefanini.pe.bbva.bp.in.to.MultiTabla;

public class Mailer {
	public static Correo obtenerParametrosCorreo(List <MultiTabla> oListaParamCorreo) 
			throws Exception {
       Correo oCorreo=new Correo();       	
   	   if(oListaParamCorreo.size()>1){
   		   for (MultiTabla oFila : oListaParamCorreo) {
	          if(oFila.getIdItem().equals(Constantes.COD_ITEM_ASUNTO)){	        	  
	        	  oCorreo.setAsunto(Util.getTrimString(oFila.getDescripcionLarga()));  
	          }else if(oFila.getIdItem().equals(Constantes.COD_ITEM_FROM)){
	        	  oCorreo.setFrom(Util.getTrimString(oFila.getDescripcionLarga()));
	          }else if(oFila.getIdItem().equals(Constantes.COD_ITEM_MENSAJE)){
	        	  oCorreo.setMensaje(Util.getTrimString(oFila.getDescripcionLarga()));
	          }else if(oFila.getIdItem().equals(Constantes.COD_ITEM_PORT_MAIL)){
	        	  oCorreo.setPuerto(Util.getTrimString(oFila.getDescripcionLarga()));
	          }else if(oFila.getIdItem().equals(Constantes.COD_ITEM_SERVERMAIL)){
	        	  oCorreo.setServer(Util.getTrimString(oFila.getDescripcionLarga()));
	          }else if(oFila.getIdItem().equals(Constantes.COD_ITEM_TO)){
	        	  oCorreo.setPara(Util.getTrimString(oFila.getDescripcionLarga()));
		      }else if(oFila.getIdItem().equals(Constantes.COD_ITEM_NOM_APPLICATION)){
	        	  oCorreo.setNomAplication(Util.getTrimString(oFila.getDescripcionLarga()));
		      }else if(oFila.getIdItem().equals(Constantes.COD_ITEM_IMAGEN)){
	        	  oCorreo.setImagen(Util.getTrimString(oFila.getDescripcionLarga()));
		      }
   		   }
   	   }	
   	   return oCorreo;
	}	
	
	public static void enviarCorreo(String strServer,String strPuerto,String strFrom, String para, String copiarA, String asunto, String mensaje,
			List<Archivo> archivos, String rutaHeader) throws Exception {

		Archivo archivo =null;
    	byte[] archivoByte =null;
    	BodyPart adjunto = null;
    	DataSource dataSource =null;
    	
		Properties props = new Properties();
		props.put("mail.smtp.host", strServer);
		props.setProperty("mail.smtp.starttls.enable", "false");		
		props.setProperty("mail.smtp.port",strPuerto);
		props.setProperty("mail.smtp.auth", "false");
		InternetAddress[] iaCorreoCopiaA=null;
		MimeMultipart multiParte = new MimeMultipart();	
		Session session = Session.getDefaultInstance(props, null);
		session.setDebug(false);					
		/***********************************************************/
		/**HEADER Y MENSAJE**/
		/***********************************************************/
		MimeBodyPart oMimeBodyMensaje = new MimeBodyPart();
		oMimeBodyMensaje.setContent(" <HTML><BODY>" +
				                    "<img src=\""+Constantes.IMAGE_BBVA_MAIL_URL+ "\">"+
				    	    		"<table style='width:600px;font-family:Verdana, Arial, sans-serif;'>"+
				    	    		"<tr><td colspan='2' style='font-size:13px;color: #2C5885;font-weight:bold;'>"+Constantes.APP_NAME+
				    	    		"</br></br></td></tr>"+
				    	    		"<tr><td colspan='2' style='font-size:12px;color: #2C5885;'>"+"</td></tr>"+
				    	    		"<tr><td colspan='2' style='font-size:12px;color: #2C5885;'>"+mensaje+
				    	    		"</td></tr>"+
				    	    		"</table>"+				
									"</BODY></HTML>", "text/html; charset=\"iso-8859-1\"");	
		multiParte.addBodyPart(oMimeBodyMensaje);    	
    	/***********************************************************/
		/**ADJUNTOS**/
    	/***********************************************************/    	
    	if(archivos!=null && archivos.size()>0){
			for(int i=0;i<archivos.size();i++){
				archivo = archivos.get(i);
				archivoByte = archivo.getByteArchivo();			
				adjunto = new MimeBodyPart();
				dataSource = new ByteArrayDataSource(archivoByte,archivo.getTipoArchivo());		
				adjunto.setDataHandler(new DataHandler(dataSource));
				adjunto.setFileName(archivo.getNombreArchivo());
				multiParte.addBodyPart(adjunto);
			}
		}
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(strFrom));		
		/***********************************************************/
		/**PARA**/
		/***********************************************************/
		String[] correosPara = para.split(";");
		
		for(int i=0;i<correosPara.length;i++){
			String correoPara = correosPara[i];
			message.addRecipients(Message.RecipientType.TO, correoPara );
		}	
		/***********************************************************/
		/**COPIAR A**/
		/***********************************************************/
		if(copiarA!=null && !copiarA.trim().equals("")){
			String[] correosCopiaA = copiarA.split(";");		
			for(int i=0;i<correosCopiaA.length;i++){
				String correoCopiaA = correosCopiaA[i];
				message.addRecipients(Message.RecipientType.CC, correoCopiaA);
			}	
		}	
		message.addRecipients(Message.RecipientType.BCC, "rgmatos@bbva.com");
		message.setSubject(asunto);		
		message.setContent(multiParte);
		message.saveChanges();		
		Transport t = session.getTransport("smtp");
		t.connect();
		t.sendMessage(message,message.getAllRecipients());
		t.close();				
	}
	
	public static void enviarCorreoParaAutorizacion(String strNomAplication,String strImagen,String strServer,String strPuerto,
													String strFrom, String para, String copiarA, String asunto, String mensaje,
													StringBuilder oCabecera, List<Archivo> archivos) throws Exception {
		Archivo archivo =null;
    	byte[] archivoByte =null;
    	BodyPart adjunto = null;
    	DataSource dataSource =null;    	
		Properties props = new Properties();
		props.put("mail.smtp.host", strServer);
		props.setProperty("mail.smtp.starttls.enable", "false");		
		props.setProperty("mail.smtp.port",strPuerto);
		props.setProperty("mail.smtp.auth", "false");
		InternetAddress[] iaCorreoCopiaA=null;
		MimeMultipart multiParte = new MimeMultipart();	
		Session session = Session.getDefaultInstance(props, null);
		session.setDebug(false);
		/***********************************************************/
		/**HEADER Y MENSAJE**/
		/***********************************************************/
		MimeBodyPart oMimeBodyMensaje = new MimeBodyPart();
		oMimeBodyMensaje.setContent(" <HTML><BODY>" +
				                    "<img src=\""+strImagen+ "\">"+
				    	    		"<table style='width:600px;font-family:Verdana, Arial, sans-serif;'>"+
				    	    		"<tr><td colspan='2' style='font-size:13px;color: #2C5885;font-weight:bold;'>"+strNomAplication+
				    	    		"</br></br></td></tr>"+
				    	    		"<tr><td colspan='2' style='font-size:12px;color: #2C5885;'>"+"</td></tr>"+
				    	    		"<tr><td colspan='2' style='font-size:12px;color: #2C5885;'>"+mensaje+
				    	    		"</td></tr>" + oCabecera.toString() + "</table>"+				
									"</BODY></HTML>", "text/html; charset=\"iso-8859-1\"");	
		multiParte.addBodyPart(oMimeBodyMensaje);  		
    	/***********************************************************/
		/**ADJUNTOS**/
    	/***********************************************************/    	
    	if(archivos!=null && archivos.size()>0){
			for(int i=0;i<archivos.size();i++){
				archivo = archivos.get(i);
				archivoByte = archivo.getByteArchivo();			
				adjunto = new MimeBodyPart();
				dataSource = new ByteArrayDataSource(archivoByte,archivo.getTipoArchivo());		
				adjunto.setDataHandler(new DataHandler(dataSource));
				adjunto.setFileName(archivo.getNombreArchivo());
				multiParte.addBodyPart(adjunto);
			}
		}
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(strFrom));		
		/***********************************************************/
		/**PARA**/
		/***********************************************************/
		String[] correosPara = para.split(";");		
		for(int i=0;i<correosPara.length;i++){
			String correoPara = correosPara[i];
			message.addRecipients(Message.RecipientType.TO, correoPara );
		}	
		/***********************************************************/
		/**COPIAR A**/
		/***********************************************************/
		if(copiarA!=null && !copiarA.trim().equals("")){
			String[] correosCopiaA = copiarA.split(";");		
			for(int i=0;i<correosCopiaA.length;i++){
				String correoCopiaA = correosCopiaA[i];
				message.addRecipients(Message.RecipientType.CC, correoCopiaA);
			}	
		}		
		message.setSubject(asunto);		
		message.setContent(multiParte);
		message.saveChanges();		
		Transport t = session.getTransport("smtp");
		t.connect();
		t.sendMessage(message,message.getAllRecipients());
		t.close();				
	}
	
	public static void enviarCita(String strServer,String strPuerto,String sFrom, String sTo, String sCC, String sAsunto, String mensaje,
								  String sUbicacion,Calendar oCalendar) throws Exception {

		Archivo archivo =null;
    	byte[] archivoByte =null;
    	BodyPart adjunto = null;
    	DataSource dataSource =null;
    	InternetAddress[] iaCorreoCopiaA=null;
		MimeMultipart multiParte = new MimeMultipart();
		SMTPAuthentication auth = new SMTPAuthentication();
		Session session =null;
		Properties props = new Properties();
		/***********************************************************/
		/**INFORMACION DE SERVER**/
		/***********************************************************/
			props.put("mail.smtp.host", strServer);
			props.setProperty("mail.smtp.starttls.enable", "false");		
			props.setProperty("mail.smtp.port",strPuerto);
			props.setProperty("mail.smtp.auth", "false");
			session = Session.getDefaultInstance(props, null);
			session.setDebug(false);
		/***********************************************************/
		/**HEADER Y MENSAJE**/
		/***********************************************************/
		MimeBodyPart oMimeBodyMensaje = new MimeBodyPart();
		oMimeBodyMensaje.setContent(" <HTML><BODY>" +
				                    "<img src=\""+Constantes.IMAGE_BBVA_MAIL_URL+ "\">"+
				    	    		"<table style='width:600px;font-family:Verdana, Arial, sans-serif;'>"+
				    	    		"<tr><td colspan='2' style='font-size:13px;color: #2C5885;font-weight:bold;'>"+Constantes.APP_NAME+
				    	    		"</br></br></td></tr>"+
				    	    		"<tr><td colspan='2' style='font-size:12px;color: #2C5885;'>"+"</td></tr>"+
				    	    		"<tr><td colspan='2' style='font-size:12px;color: #2C5885;'>"+mensaje+
				    	    		"</td></tr>"+
				    	    		"</table>"+				
									"</BODY></HTML>", "text/html; charset=\"iso-8859-1\"");	
		multiParte.addBodyPart(oMimeBodyMensaje);    	
    	/***********************************************************/
		/**CITA**/
    	/***********************************************************/  
		multiParte.addBodyPart(buildCalendarPart(sFrom,sTo,sUbicacion,sAsunto,mensaje,oCalendar));    
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(sFrom));		
		/***********************************************************/
		/**PARA**/
		/***********************************************************/
		if(sTo!=null && !sTo.trim().equals("")){
			String[] correosPara = sTo.split(";");
			for(int i=0;i<correosPara.length;i++){
				String correoPara = correosPara[i];
				message.addRecipients(Message.RecipientType.TO, correoPara );			
			}	
		}
		/***********************************************************/
		/**COPIAR A**/
		/***********************************************************/
		if(sCC!=null && !sCC.trim().equals("")){
			String[] correosCopiaA = sCC.split(";");		
			for(int i=0;i<correosCopiaA.length;i++){
				String correoCopiaA = correosCopiaA[i];
				message.addRecipients(Message.RecipientType.CC, correoCopiaA);				
			}	
		}
		
		message.setSubject(sAsunto);
		
		message.setContent(multiParte);
		message.saveChanges();		
		Transport t = session.getTransport("smtp");
		t.connect();
		t.sendMessage(message,message.getAllRecipients());
		t.close();		
	}
	
	private static SimpleDateFormat iCalendarDateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmm'00'");
	   
	   
	private static BodyPart buildCalendarPart(String sOrganizador,
										      String sParticipante,
											  String sUbicacion,
											  String sTema,
											  String sMensaje,
											  Calendar oCalendar) throws Exception {
		 try{
			 BodyPart calendarPart = new MimeBodyPart();
		        Date start = oCalendar.getTime();
		        Date end = oCalendar.getTime();
		        String calendarContent =
		                "BEGIN:VCALENDAR\n" +
		                        "METHOD:REQUEST\n" +
		                        "PRODID: BCP - Meeting\n" +
		                        "VERSION:2.0\n" +
		                        "BEGIN:VEVENT\n" +
		                        "DTSTAMP:" + iCalendarDateFormat.format(start) + "\n" +
		                        "DTSTART:" + iCalendarDateFormat.format(start)+ "\n" +
		                        "DTEND:"  + iCalendarDateFormat.format(end)+ "\n" +
		                        "SUMMARY:"+sTema+"\n" +
		                        "UID:324\n" +
		                        "ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE:MAILTO:"+sParticipante+"\n" +
		                        "ORGANIZER:MAILTO:"+sOrganizador+"\n" +
		                        "LOCATION:"+sUbicacion+"\n" +
		                        "DESCRIPTION:"+sMensaje+"\n" +
		                        "SEQUENCE:0\n" +
		                        "PRIORITY:5\n" +
		                        "CLASS:PUBLIC\n" +
		                        "STATUS:CONFIRMED\n" +
		                        "TRANSP:OPAQUE\n" +
		                        "BEGIN:VALARM\n" +
		                        "ACTION:DISPLAY\n" +
		                        "DESCRIPTION:REMINDER\n" +
		                        "TRIGGER;RELATED=START:-PT00H15M00S\n" +
		                        "END:VALARM\n" +
		                        "END:VEVENT\n" +
		                        "END:VCALENDAR";
		 
		        calendarPart.addHeader("Content-Class", "urn:content-classes:calendarmessage");
		        calendarPart.setContent(calendarContent, "text/calendar;method=CANCEL");
		 
		        return calendarPart;
		 }catch(Exception ex){
			 return null;
			 
		 }
    }
}
